//package com.empire.module.member.service.internetaccount;
//
//import cn.hutool.core.collection.CollUtil;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.IdUtil;
//import cn.hutool.core.util.RandomUtil;
//import lombok.Data;
//
//import java.util.*;
//import java.util.concurrent.TimeUnit;
//
///**
// * 互联网账号及关注关系数据模拟生成器
// * 生成1000条账号记录和配套的关注关系，支撑相似账号分析
// */
//public class InternetAccountDataGenerator {
//
//    // 账号类型：固定为Twitter（假设字典ID=4）
//    private static final Long ACCOUNT_TYPE_ID = 4L;
//    // 生成账号数量
//    private static final int ACCOUNT_COUNT = 1000;
//    // 头部账号占比（粉丝量高的账号）
//    private static final double TOP_ACCOUNT_RATIO = 0.1; // 10%
//    // 头部账号粉丝范围（万）
//    private static final int[] TOP_FAN_RANGE = {10, 100};
//    // 普通账号粉丝范围（千）
//    private static final int[] NORMAL_FAN_RANGE = {1, 10};
//    // 每个账号的关注者数量范围（头部账号更多）
//    private static final int[] TOP_FOLLOWER_RANGE = {500, 2000};
//    private static final int[] NORMAL_FOLLOWER_RANGE = {50, 300};
//    // 相似账号组数量（每组内账号共享高比例粉丝）
//    private static final int SIMILAR_GROUP_COUNT = 20;
//    // 每组相似账号数量
//    private static final int ACCOUNTS_PER_GROUP = 5;
//    // 相似账号组内共享粉丝比例
//    private static final double SHARED_FAN_RATIO = 0.4; // 40%
//
//    // 存储所有生成的账号信息（user_gen_uuid -> 账号对象）
//    private Map<String, InternetAccountDO> accountMap = new HashMap<>();
//    // 所有账号的user_gen_uuid列表
//    private List<String> allAccountUuids = new ArrayList<>();
//    // 相似账号组（每组包含多个账号的uuid）
//    private List<List<String>> similarGroups = new ArrayList<>();
//
//    /**
//     * 生成所有数据并返回SQL
//     */
//    public Map<String, String> generateAllData() {
//        // 1. 生成账号数据
//        generateInternetAccounts();
//        // 2. 初始化相似账号组
//        initSimilarGroups();
//        // 3. 生成关注关系数据
//        List<String> followSqls = generateFollowRelations();
//
//        // 组装SQL
//        Map<String, String> result = new HashMap<>();
//        result.put("accountSql", buildAccountInsertSql());
//        result.put("followSql", buildFollowInsertSql(followSqls));
//        return result;
//    }
//
//    /**
//     * 生成1000条互联网账号数据
//     */
//    private void generateInternetAccounts() {
//        // 账号标签池（用于分类，辅助相似性）
//        List<String> tagPool = Arrays.asList("tech,ai", "music,pop", "sports,football", "food,cooking",
//                "travel,adventure", "finance,invest", "gaming,esports", "health,fitness");
//        // 地区池
//        List<String> locationPool = Arrays.asList("New York, US", "London, UK", "Tokyo, JP", "Paris, FR",
//                "Sydney, AU", "Beijing, CN", "Los Angeles, US", "Berlin, DE");
//
//        for (int i = 1; i <= ACCOUNT_COUNT; i++) {
//            InternetAccountDO account = new InternetAccountDO();
//            account.setId((long) i);
//            // 创建时间：2023-2024年随机
//            Date createTime = DateUtil.offset(new Date(), DateUtil.MONTH, -RandomUtil.randomInt(1, 24));
//            account.setCreateTime(createTime);
//            account.setAccountTypeId(ACCOUNT_TYPE_ID);
//            account.setCreator("system");
//            account.setUpdater("system");
//
//            // 用户名：@+标签前缀+随机数
//            String tagPrefix = tagPool.get(RandomUtil.randomInt(tagPool.size())).split(",")[0];
//            String username = "@" + tagPrefix + "_" + RandomUtil.randomInt(1000, 9999);
//            account.setUsername(username);
//
//            // 唯一标识UUID
//            String userGenUuid = IdUtil.fastSimpleUUID(); // 32位UUID
//            account.setUserGenUuid(userGenUuid);
//            allAccountUuids.add(userGenUuid);
//
//            // 昵称：随机英文单词
//            account.setNickname(RandomUtil.randomStringUpper(5) + RandomUtil.randomInt(100));
//
//            // 粉丝数：头部账号和普通账号区分
//            boolean isTopAccount = i <= ACCOUNT_COUNT * TOP_ACCOUNT_RATIO;
//            int fanCount = isTopAccount
//                    ? RandomUtil.randomInt(TOP_FAN_RANGE[0] * 10000, TOP_FAN_RANGE[1] * 10000)
//                    : RandomUtil.randomInt(NORMAL_FAN_RANGE[0] * 1000, NORMAL_FAN_RANGE[1] * 1000);
//            account.setFanCount(fanCount);
//
//            // 发文数：与粉丝数正相关
//            account.setArticleCount(Math.max(10, (int) (fanCount * RandomUtil.randomDouble(0.001, 0.01))));
//
//            // 其他字段
//            account.setLocation(locationPool.get(RandomUtil.randomInt(locationPool.size())));
//            account.setTags(tagPool.get(RandomUtil.randomInt(tagPool.size())));
//            account.setDeleted(false);
//            account.setJoinTime(createTime.getTime() / 1000); // 加入时间戳（秒）
//            account.setCollectTime(DateUtil.offset(createTime, DateUtil.MONTH, RandomUtil.randomInt(1, 6)).getTime() / 1000);
//            account.setUpdateTime(DateUtil.offset(account.getCollectTime(), DateUtil.DAY, RandomUtil.randomInt(1, 30)));
//
//            accountMap.put(userGenUuid, account);
//        }
//    }
//
//    /**
//     * 初始化相似账号组（确保每组账号有重叠粉丝）
//     */
//    private void initSimilarGroups() {
//        // 从所有账号中随机挑选组成相似组
//        List<String> remainingUuids = new ArrayList<>(allAccountUuids);
//        RandomUtil.shuffle(remainingUuids);
//
//        for (int i = 0; i < SIMILAR_GROUP_COUNT; i++) {
//            List<String> group = new ArrayList<>();
//            // 每组取5个账号
//            for (int j = 0; j < ACCOUNTS_PER_GROUP && !remainingUuids.isEmpty(); j++) {
//                group.add(remainingUuids.remove(0));
//            }
//            similarGroups.add(group);
//        }
//    }
//
//    /**
//     * 生成关注关系数据（支撑相似分析）
//     */
//    private List<String> generateFollowRelations() {
//        List<String> followSqls = new ArrayList<>();
//        long followId = 1;
//        Set<String> usedFanUuids = new HashSet<>(); // 确保关注者UUID唯一
//
//        // 为每个相似组生成共享粉丝
//        for (List<String> group : similarGroups) {
//            if (CollUtil.size(group) < 2) continue;
//
//            // 生成组内共享粉丝（数量为组内第一个账号关注者数的40%）
//            InternetAccountDO firstAccount = accountMap.get(group.get(0));
//            int sharedFanCount = (int) (getFollowerCount(firstAccount) * SHARED_FAN_RATIO);
//            List<String> sharedFans = generateUniqueFanUuids(sharedFanCount, usedFanUuids);
//
//            // 共享粉丝关注组内所有账号
//            for (String fanUuid : sharedFans) {
//                for (String accountUuid : group) {
//                    followSqls.add(buildFollowSql(followId++, fanUuid, accountUuid, accountMap.get(accountUuid)));
//                }
//            }
//        }
//
//        // 为每个账号生成独有的粉丝（非共享部分）
//        for (Map.Entry<String, InternetAccountDO> entry : accountMap.entrySet()) {
//            String accountUuid = entry.getKey();
//            InternetAccountDO account = entry.getValue();
//            int totalFollower = getFollowerCount(account);
//
//            // 计算已分配的共享粉丝数
//            int sharedCount = 0;
//            for (List<String> group : similarGroups) {
//                if (group.contains(accountUuid)) {
//                    InternetAccountDO first = accountMap.get(group.get(0));
//                    sharedCount = (int) (getFollowerCount(first) * SHARED_FAN_RATIO);
//                    break;
//                }
//            }
//
//            // 生成独有的粉丝
//            int uniqueFanCount = totalFollower - sharedCount;
//            if (uniqueFanCount > 0) {
//                List<String> uniqueFans = generateUniqueFanUuids(uniqueFanCount, usedFanUuids);
//                for (String fanUuid : uniqueFans) {
//                    followSqls.add(buildFollowSql(followId++, fanUuid, accountUuid, account));
//                }
//            }
//        }
//
//        return followSqls;
//    }
//
//    /**
//     * 生成唯一的关注者UUID
//     */
//    private List<String> generateUniqueFanUuids(int count, Set<String> used) {
//        List<String> fans = new ArrayList<>();
//        for (int i = 0; i < count; i++) {
//            String fanUuid;
//            do {
//                fanUuid = "fan_" + IdUtil.fastSimpleUUID().substring(0, 16);
//            } while (used.contains(fanUuid));
//            used.add(fanUuid);
//            fans.add(fanUuid);
//        }
//        return fans;
//    }
//
//    /**
//     * 获取账号应有的关注者数量
//     */
//    private int getFollowerCount(InternetAccountDO account) {
//        boolean isTop = account.getFanCount() >= TOP_FAN_RANGE[0] * 10000;
//        return isTop
//                ? RandomUtil.randomInt(TOP_FOLLOWER_RANGE[0], TOP_FOLLOWER_RANGE[1])
//                : RandomUtil.randomInt(NORMAL_FOLLOWER_RANGE[0], NORMAL_FOLLOWER_RANGE[1]);
//    }
//
//    /**
//     * 构建账号插入SQL
//     */
//    private String buildAccountInsertSql() {
//        StringBuilder sql = new StringBuilder();
//        sql.append("INSERT INTO `data_mining`.`member_internet_account` (`id`, `create_time`, `account_type_id`, `creator`, `user_id`, `updater`, `username`, `username_id`, `nickname`, `url`, `description`, `email`, `head_photo_url`, `head_photo`, `article_count`, `fan_count`, `fan_other_count`, `liked_count`, `like_count`, `location`, `join_time`, `collect_time`, `update_time`, `user_gen_uuid`, `tags`, `deleted`, `person_id`, `create_dept_id`) VALUES ");
//
//        List<String> values = new ArrayList<>();
//        for (InternetAccountDO account : accountMap.values()) {
//            values.add(String.format(
//                    "(%d, '%s', %d, '%s', NULL, '%s', '%s', %d, '%s', '%s', NULL, NULL, '%s', NULL, %d, %d, %d, %d, %d, '%s', %d, %d, '%s', '%s', '%s', %b, NULL, NULL)",
//                    account.getId(),
//                    DateUtil.format(account.getCreateTime(), "yyyy-MM-dd HH:mm:ss"),
//                    account.getAccountTypeId(),
//                    account.getCreator(),
//                    account.getUpdater(),
//                    account.getUsername(),
//                    account.getId() + 1000000, // username_id（模拟murmurhash）
//                    account.getNickname(),
//                    "https://twitter.com/" + account.getUsername().substring(1), // url
//                    "https://picsum.photos/id/" + account.getId() + "/200", // head_photo_url
//                    account.getArticleCount(),
//                    account.getFanCount(),
//                    RandomUtil.randomInt(10, 500), // fan_other_count
//                    RandomUtil.randomInt(1000, 100000), // liked_count
//                    RandomUtil.randomInt(100, 5000), // like_count
//                    account.getLocation(),
//                    account.getJoinTime(),
//                    account.getCollectTime(),
//                    DateUtil.format(account.getUpdateTime(), "yyyy-MM-dd HH:mm:ss"),
//                    account.getUserGenUuid(),
//                    account.getTags(),
//                    account.isDeleted()
//            ));
//        }
//
//        sql.append(String.join(", ", values)).append(";");
//        return sql.toString();
//    }
//
//    /**
//     * 构建关注关系插入SQL
//     */
//    private String buildFollowInsertSql(List<String> followSqls) {
//        StringBuilder sql = new StringBuilder();
//        sql.append("INSERT INTO `data_mining`.`member_internet_account_follow` (`id`, `create_time`, `dictionary_id`, `follow_user_gen_uuid`, `followed_user_gen_uuid`, `user_id`, `username`, `username_id`, `nickname`, `url`, `description`, `email`, `head_photo_url`, `head_photo`, `article_count`, `fan_count`, `fan_other_count`, `liked_count`, `like_count`, `location`, `join_time`, `collect_time`, `update_time`, `create_dept_id`) VALUES ");
//        sql.append(String.join(", ", followSqls)).append(";");
//        return sql.toString();
//    }
//
//    /**
//     * 构建单条关注关系SQL
//     */
//    private String buildFollowSql(long id, String fanUuid, String followedUuid, InternetAccountDO followedAccount) {
//        Date createTime = DateUtil.offset(new Date(), DateUtil.DAY, -RandomUtil.randomInt(1, 365));
//        return String.format(
//                "(%d, '%s', %d, '%s', '%s', NULL, '%s', %d, 'Fan_%s', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, NULL, NULL, '%s', %d, %d, %d, NULL)",
//                id,
//                DateUtil.format(createTime, "yyyy-MM-dd HH:mm:ss"),
//                ACCOUNT_TYPE_ID,
//                fanUuid,
//                followedUuid,
//                fanUuid.substring(0, 15), // 关注者username
//                id + 2000000, // username_id
//                RandomUtil.randomString(5), // 粉丝昵称后缀
//                followedAccount.getLocation(), // 粉丝地区（与被关注者同地区，增加合理性）
//                createTime.getTime() / 1000, // join_time
//                createTime.getTime() / 1000, // collect_time
//                createTime.getTime() / 1000  // update_time
//        );
//    }
//
//    // 内部类：模拟账号实体
//    @Data
//    public static class InternetAccountDO {
//        private Long id;
//        private Date createTime;
//        private Long accountTypeId;
//        private String creator;
//        private String userId;
//        private String updater;
//        private String username;
//        private Long usernameId;
//        private String nickname;
//        private String url;
//        private String description;
//        private String email;
//        private String headPhotoUrl;
//        private String headPhoto;
//        private Integer articleCount;
//        private Integer fanCount;
//        private Integer fanOtherCount;
//        private Integer likedCount;
//        private Integer likeCount;
//        private String location;
//        private Long joinTime;
//        private Long collectTime;
//        private Date updateTime;
//        private String userGenUuid;
//        private String tags;
//        private boolean deleted;
//        private Long personId;
//        private Long createDeptId;
//    }
//
//    /**
//     * 测试生成数据
//     */
//    public static void main(String[] args) {
//        InternetAccountDataGenerator generator = new InternetAccountDataGenerator();
//        Map<String, String> sqlMap = generator.generateAllData();
//        // 实际使用时可将SQL写入文件或直接执行
//        System.out.println("账号表SQL长度：" + sqlMap.get("accountSql").length());
//        System.out.println("关注关系表SQL长度：" + sqlMap.get("followSql").length());
//        System.out.println("数据生成完成，共生成1000条账号记录和" +
//                (sqlMap.get("followSql").split("\\),\\(").length) + "条关注关系记录");
//    }
//}
